package org.bite;

import com.mysql.cj.jdbc.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.*;
import java.text.MessageFormat;
import java.util.Scanner;

public class Demo03_DataSource {
    public static void main(String[] args) {
        //定义MySQL数据源对象
        MysqlDataSource mysqlDataSource=new MysqlDataSource();
        //设置数据库连接串
        mysqlDataSource.setURL("jdbc:mysql://127.0.0.1:3306/java114?characterEncoding=utf8" +
                "&allowPublicKeyRetrieval=true&useSSL=false");
        //用户名
        mysqlDataSource.setUser("root");
        //密码
        mysqlDataSource.setPassword("123456");

        //定义JDBC的数据源对象
        DataSource dataSource=mysqlDataSource;

        //定义数据库连接对象
        Connection connection=null;
        //定义执行SQL的对象
        //Statement statement=null; 不安全
        PreparedStatement statement=null;//预处理SQL对象

        //定义结果集对象
        ResultSet resultSet=null;

        try {
            // 1.通过数据源对象获取数据库连接
            connection=dataSource.getConnection();
            //2.定义SQL语句
            String sql="select * from student where name=?";//用占位符?代替
            //3.预处理SQL执行对象
            statement=connection.prepareStatement(sql);
              //接收输入值
                System.out.println("请输入学生名字:");
                Scanner sc=new Scanner(System.in);
                String inName=sc.next();
              //用真实的值替换占位符
                statement.setString(1,inName);//set数据类型 第几个位置(1开始) 数据的值
            //4.执行SQL获取结果
            resultSet= statement.executeQuery();

            //5.遍历结果集
            while(resultSet.next()){//初始游标为第一行前,next()到下一行
                //获取具体列的值 用相应的数据类型接收(或者创建对象接收)
                //resultSet.getLong(1); 通过列名或者顺序获取
                long id=resultSet.getLong("id");
                String name=resultSet.getString("name");
                String sno=resultSet.getString("sno");
                int age=resultSet.getInt("age");
                System.out.println(MessageFormat.format("学生编号={0},学号={1},姓名={2},年龄={3}",id,sno,name,age));
                //格式化输出字符串 数字为占位符
            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally {
            //释放结果集对象
            if (resultSet == null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
            //释放Statement
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
            //关闭数据库连接
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
        }

    }
}
